`
https://leetcode.cn/problems/subarray-sum-equals-k/
`

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var subarraySum = function (nums, k) {
  const n = nums.length

  // 计算前缀和
  const prefix = new Array(n + 1)
  prefix[0] = 0
  for (let i = 1; i < prefix.length; i++) {
    prefix[i] = prefix[i - 1] + nums[i - 1]
  }

  // 使用哈希表记录前缀和出现过的次数
  const counts = new Map()

  // 符合条件的子数组个数计数器，返回值
  let count = 0

  for (let i = 0; i < prefix.length; i++) {
    // 计算出当前前缀和与 k 的差值
    const need = prefix[i] - k

    // 如果之前存在前缀和等于 need，那么就说明存在至少一个子数组的和为 k
    if (counts.has(need)) {
      count += counts.get(need)
    }

    // 将当前前缀和加入出现次数的记录
    if (!counts.has(prefix[i])) {
      counts.set(prefix[i], 1)
    } else {
      counts.set(prefix[i], counts.get(prefix[i]) + 1)
    }
  }

  return count
};